home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr48 / qoutstuf.zip / ANSIEDIT.PAS next >
Pascal/Delphi Source File  |  1993-04-07  |  17KB  |  893 lines

  1. {$R-,S-,I-,D-,F+,V-,B-,N-,L+,O+ }
  2.  
  3. unit ansiedit;    (* Ansi Full Screen Editor *)
  4.  
  5. interface
  6.  
  7. uses crt,
  8.          gentypes,modem,configrt,windows,gensubs,subs1,subs2;
  9.  
  10. function ansireedit (var m:message; gettitle:boolean):boolean;
  11.  
  12. implementation
  13.  
  14. function ansireedit (var m:message; gettitle:boolean):boolean;
  15. var topline,curline,cx,cy,cols,scrnsize,lines,
  16.     rightmargin,savedx,savedy,topscrn:integer;
  17.     insertmode,msgdone,ansimode:boolean;
  18.  
  19.  
  20. function curx:integer;
  21. begin
  22.   curx:=wherex
  23. end;
  24.  
  25. function cury:integer;
  26. begin
  27.   cury:=wherey-topscrn+1
  28. end;
  29.  
  30. procedure moveto (x,y:integer);
  31. begin
  32.   y:=y+topscrn-1;
  33.     write (direct,#27'[');
  34.     if y<>1 then write (direct,strr(y));
  35.     if x<>1 then write (direct,';',strr(x));
  36.     write ('H')
  37. end;
  38.  
  39.  
  40. procedure cleareol;
  41. begin
  42.     write (direct,#27'[K')
  43. end;
  44.  
  45. procedure savecsr;
  46. begin
  47.     write (direct,#27'[s')
  48. end;
  49.  
  50. procedure restorecsr;
  51. begin
  52.     write (direct,#27'[u')
  53. end;
  54.  
  55. procedure cmove (k:char; n,dx,dy:integer);
  56. var cnt:integer;
  57. begin
  58.   if n<1 then exit;
  59.     write (direct,#27'[');
  60.     if n<>1 then write (direct,strr(n));
  61.     write (direct,k)
  62. end;
  63.  
  64. procedure cup (n:integer);
  65. begin
  66.   cmove ('A',n,0,-1)
  67. end;
  68.  
  69. procedure cdn (n:integer);
  70. begin
  71.   cmove ('B',n,0,1)
  72. end;
  73.  
  74. procedure clf (n:integer);
  75. var cnt:integer;
  76. begin
  77.   cmove ('D',n,-1,0)
  78. end;
  79.  
  80. procedure crg (n:integer);
  81. begin
  82.   cmove ('C',n,1,0)
  83. end;
  84.  
  85. procedure checkspaces;
  86. var q:^lstr;
  87. begin
  88.   q:=addr(m.text[curline]);
  89.   while q^[length(q^)]=' ' do q^[0]:=pred(q^[0])
  90. end;
  91.  
  92. procedure checkcx;
  93. var n:integer;
  94. begin
  95.   n:=length(m.text[curline])+1;
  96.   if cx>n then cx:=n
  97. end;
  98.  
  99. procedure computecy;
  100. begin
  101.   cy:=curline-topline+1
  102. end;
  103.  
  104. procedure updatecpos;
  105. begin
  106.   computecy;
  107.   moveto (cx,cy);
  108.  end;
  109.  
  110. procedure insertabove;
  111. var cnt:integer;
  112. begin
  113.   if m.numlines=maxmessagesize then exit;
  114.   for cnt:=m.numlines downto curline do m.text[cnt+1]:=m.text[cnt];
  115.   m.text[curline]:='';
  116.   m.numlines:=m.numlines+1
  117. end;
  118.  
  119. procedure deletethis;
  120. var cnt:integer;
  121. begin
  122.   if m.numlines=1 then begin
  123.     m.text[1]:='';
  124.     exit
  125.   end;
  126.   for cnt:=curline+1 to m.numlines do m.text[cnt-1]:=m.text[cnt];
  127.   m.text[m.numlines]:='';
  128.   m.numlines:=m.numlines-1;
  129.   checkcx
  130. end;
  131.  
  132. procedure fullrefresh;
  133. var cnt,n,foxx:integer;
  134. begin
  135.   clearscr;
  136.   if topline<1 then topline:=1;
  137.   computecy;
  138.   WriteLn(^R'╒══▌'^S' MSi  v0.01  '^A'■ '^S'CTRL-U - Help!'^R'▐═════════▌'^P' Date:           Time:          '^R'▐═╕');
  139.   WriteLn(^R'│ '^A'Command'^P':    Title'^R':'^P'                               To'^R':                        │');
  140.   WriteLn(^R'╘═════════════════════════════════════════════════════════════════════════════╛');
  141.   MoveTo(52,-3); Write(^U+datestr(now));
  142.   MoveTo(68,-3); Write(^U+timestr(now));
  143.   Moveto(22,-2); Write(^S+m.title);
  144.   MoveTo(56,-2); Write(^S+m.sendto);
  145.   ansicolor(urec.inputcolor);
  146.   moveto (1,1);
  147.   for cnt:=1 to lines do begin
  148.     n:=cnt+topline-1;
  149.     if n<=m.numlines then begin
  150.       write (m.text[n]);
  151.       if cnt<>lines then writeln
  152.     end
  153.   end;
  154.   updatecpos
  155. end;
  156.  
  157. procedure repos (dorefresh:boolean);
  158. var cl,tl:integer;
  159. begin
  160.   checkspaces;
  161.   cl:=curline;
  162.   tl:=topline;
  163.   if curline<1 then curline:=1;
  164.   if curline>m.numlines then curline:=m.numlines;
  165.   if topline>curline then topline:=curline;
  166.   if topline+lines<curline then topline:=curline-lines;
  167.   if topline<1 then topline:=1;
  168.   checkcx;
  169.   computecy;
  170.   if (cl=curline) and (tl=topline) and (not dorefresh)
  171.     then updatecpos
  172.     else fullrefresh
  173. end;
  174.  
  175. procedure partrefresh;  { Refreshes from CY }
  176. var cnt,n:integer;
  177. begin
  178.   if topline<1 then repos(true) else begin
  179.     moveto (1,cy);
  180.     for cnt:=cy to lines do begin
  181.       n:=cnt+topline-1;
  182.       if n<=m.numlines then write (m.text[n]);
  183.       cleareol;
  184.       if cnt<>lines then writeln
  185.     end;
  186.     updatecpos
  187.   end
  188. end;
  189.  
  190. procedure pageup;
  191. begin
  192.   checkspaces;
  193.   if curline=1 then exit;
  194.   curline:=curline-lines+4;
  195.   topline:=topline-lines+4;
  196.   repos (true)
  197. end;
  198.  
  199. procedure pagedn;
  200. begin
  201.   checkspaces;
  202.   if curline=m.numlines then exit;
  203.   curline:=curline+lines-4;
  204.   topline:=topline+lines-4;
  205.   repos (true)
  206. end;
  207.  
  208. procedure toggleins;
  209. begin
  210.   insertmode:=not insertmode
  211. end;
  212.  
  213. procedure scrolldown;
  214. begin
  215.   topline:=curline-lines+2;
  216.   repos (true)
  217. end;
  218.  
  219. procedure scrollup;
  220. begin
  221.   if topline<1 then begin
  222.     topline:=topline+1;
  223.     moveto (1,lines);
  224.     computecy;
  225.     writeln
  226.   end else begin
  227.     topline:=curline-1;
  228.     repos (true)
  229.   end
  230. end;
  231.  
  232. procedure topofmsg;
  233. begin
  234.   checkspaces;
  235.   cx:=1;
  236.   cy:=1;
  237.   curline:=1;
  238.   if topline=1
  239.     then updatecpos
  240.     else
  241.       begin
  242.         topline:=1;
  243.         fullrefresh
  244.       end
  245. end;
  246.  
  247. procedure updatetoeol;
  248. var cnt:integer;
  249. begin
  250.   savecsr;
  251.   write (copy(m.text[curline],cx,255));
  252.   cleareol;
  253.   restorecsr
  254. end;
  255.  
  256. procedure letterkey (k:char);
  257. var l:^lstr;
  258.     w:lstr;
  259.     n,ox:integer;
  260.     q:char;
  261.     inserted,refr:boolean;
  262.  
  263.   procedure scrollwwrap;
  264.   begin
  265.     if topline>0 then begin
  266.       scrollup;
  267.       exit
  268.     end;
  269.     cy:=cy-1;
  270.     moveto (length(m.text[curline-1])+1,cy);
  271.     cleareol;
  272.     writeln;
  273.     write (m.text[curline]);
  274.     topline:=topline+1;
  275.     cx:=curx
  276.   end;
  277.  
  278. begin
  279.   l:=addr(m.text[curline]);
  280.   if length(l^)>=rightmargin then begin
  281.     if curline=maxmessagesize then exit;
  282.     if cx<=length(l^) then exit;
  283.     l^:=l^+k;
  284.     w:='';
  285.     cx:=length(l^);
  286.     repeat
  287.       q:=l^[cx];
  288.       if q<>' ' then insert (q,w,1);
  289.       cx:=cx-1
  290.     until (q=' ') or (cx<1);
  291.     if cx<1 then begin
  292.       cx:=length(l^)-1;
  293.       w:=k
  294.     end;
  295.     l^[0]:=chr(cx);
  296.     checkspaces;
  297.     curline:=curline+1;
  298.     if curline>m.numlines then m.numlines:=curline;
  299.     inserted:=m.text[curline]<>'';
  300.     if inserted then insertabove;
  301.     m.text[curline]:=w;
  302.     cy:=cy+1;
  303.     ox:=cx;
  304.     cx:=length(w)+1;
  305.     refr:=cy>lines;
  306.     if refr
  307.       then scrollwwrap
  308.       else begin
  309.         if length(w)>0 then begin
  310.           moveto (ox+1,cy-1);
  311.           for n:=1 to length(w) do write (' ')
  312.         end;
  313.         if inserted and (m.numlines>curline)
  314.           then partrefresh
  315.           else begin
  316.             moveto (1,cy);
  317.             write (m.text[curline]);
  318.           end
  319.       end;
  320.     exit
  321.   end;
  322.   if insertmode
  323.     then insert (k,l^,cx)
  324.     else begin
  325.       while length(l^)<cx do l^:=l^+' ';
  326.       l^[cx]:=k
  327.     end;
  328.   if k=#27 then write(direct,k) else write (k);
  329.   cx:=cx+1;
  330.   if insertmode and (cx<=length(l^)) then updatetoeol
  331. end;
  332.  
  333. procedure back;
  334. begin
  335.   if cx=1 then begin
  336.     if curline=1 then exit;
  337.     checkspaces;
  338.     curline:=curline-1;
  339.     cy:=cy-1;
  340.     cx:=length(m.text[curline])+1;
  341.     if cy<1 then scrolldown else updatecpos;
  342.   end else begin
  343.     cx:=cx-1;
  344.     clf (1)
  345.   end
  346. end;
  347.  
  348. procedure fowrd;
  349. begin
  350.   if cx>length(m.text[curline]) then begin
  351.     if curline=maxmessagesize then exit;
  352.     checkspaces;
  353.     curline:=curline+1;
  354.     if curline>m.numlines then m.numlines:=curline;
  355.     cy:=cy+1;
  356.     cx:=1;
  357.     if cy>lines then scrollup else updatecpos
  358.   end else begin
  359.     cx:=cx+1;
  360.     crg (1)
  361.   end
  362. end;
  363.  
  364. procedure del;
  365. begin
  366.   if length(m.text[curline])=0 then begin
  367.     deletethis;
  368.     partrefresh;
  369.     exit
  370.   end;
  371.   delete (m.text[curline],cx,1);
  372.   if cx>length(m.text[curline])
  373.     then write (' '^H)
  374.     else updatetoeol
  375. end;
  376.  
  377. procedure bkspace;
  378. begin
  379.   if length(m.text[curline])=0 then begin
  380.     if curline=1 then exit;
  381.     deletethis;
  382.     checkspaces;
  383.     curline:=curline-1;
  384.     cy:=cy-1;
  385.     cx:=length(m.text[curline])+1;
  386.     if cy<1
  387.       then scrolldown
  388.       else partrefresh;
  389.     exit
  390.   end;
  391.   if cx=1 then exit;
  392.   cx:=cx-1;
  393.   write (^H);
  394.   del
  395. end;
  396.  
  397. procedure beginline;
  398. begin
  399.   if cx=1 then exit;
  400.   cx:=1;
  401.   updatecpos
  402. end;
  403.  
  404. procedure endline;
  405. var dx:integer;
  406. begin
  407.   dx:=length(m.text[curline])+1;
  408.   if cx=dx then exit;
  409.   cx:=dx;
  410.   updatecpos
  411. end;
  412.  
  413. procedure upline;
  414. var chx:boolean;
  415.     l:integer;
  416. begin
  417.   checkspaces;
  418.   if curline=1 then exit;
  419.   curline:=curline-1;
  420.   l:=length(m.text[curline]);
  421.   chx:=cx>l;
  422.   if chx then cx:=l+1;
  423.   cy:=cy-1;
  424.   if cy>0
  425.     then if chx
  426.       then updatecpos
  427.       else cup (1)
  428.     else scrolldown
  429. end;
  430.  
  431. procedure downline;
  432. var chx:boolean;
  433.     l:integer;
  434. begin
  435.   checkspaces;
  436.   if curline=maxmessagesize then exit;
  437.   curline:=curline+1;
  438.   if curline>m.numlines then m.numlines:=curline;
  439.   l:=length(m.text[curline]);
  440.   chx:=cx>l;
  441.   if chx then cx:=l+1;
  442.   cy:=cy+1;
  443.   if cy<=lines
  444.     then if chx
  445.       then updatecpos
  446.       else cdn (1)
  447.     else scrollup
  448. end;
  449.  
  450. procedure crlf;
  451. var k:char;
  452. begin
  453.   if (length(m.text[curline])=2) and (m.text[curline][1]='/') then begin
  454.     k:=upcase(m.text[curline][2]);
  455.     case k of
  456.       'S':begin
  457.         deletethis;
  458.         msgdone:=true;
  459.         ansireedit:=true;
  460.         exit
  461.       end;
  462.       'A':begin
  463.          m.numlines:=0;
  464.          msgdone:=true;
  465.          exit
  466.       end
  467.     end
  468.   end;
  469.   beginline;
  470.   downline
  471. end;
  472.  
  473. function conword:boolean;
  474. var l:^lstr;
  475. begin
  476.   l:=addr(m.text[curline]);
  477.   conword:=false;
  478.   if (cx>length(l^)) or (cx=0) then exit;
  479.   conword:=true;
  480.   if cx=1 then exit;
  481.   if (l^[cx-1]=' ') and (l^[cx]<>' ') then exit;
  482.   conword:=false
  483. end;
  484.  
  485. procedure wordleft;
  486. begin
  487.   repeat
  488.     cx:=cx-1;
  489.     if cx<1 then begin
  490.       if curline=1 then begin
  491.         cx:=1;
  492.         repos (false);
  493.         exit
  494.       end;
  495.       checkspaces;
  496.       curline:=curline-1;
  497.       cy:=cy-1;
  498.       cx:=length(m.text[curline])
  499.     end;
  500.   until conword;
  501.   if cx=0 then cx:=1;
  502.   if cy<1
  503.     then repos (true)
  504.     else updatecpos
  505. end;
  506.  
  507. procedure wordright;
  508. begin
  509.   repeat
  510.     cx:=cx+1;
  511.     if cx>length(m.text[curline]) then begin
  512.       if curline=m.numlines then begin
  513.         repos (false);
  514.         exit
  515.       end;
  516.       checkspaces;
  517.       curline:=curline+1;
  518.       cy:=cy+1;
  519.       cx:=1
  520.     end;
  521.   until conword;
  522.   if cy>lines
  523.     then repos (true)
  524.     else updatecpos
  525. end;
  526.  
  527. procedure worddel;
  528. var l:^lstr;
  529.     b:byte;
  530.     s,n:integer;
  531. begin
  532.   l:=addr(m.text[curline]);
  533.   b:=length(l^);
  534.   if cx>b then exit;
  535.   s:=cx;
  536.   repeat
  537.     cx:=cx+1
  538.   until conword or (cx>b);
  539.   n:=cx-s;
  540.   delete (l^,s,n);
  541.   cx:=s;
  542.   updatetoeol
  543. end;
  544.  
  545. procedure deleteline;
  546. begin
  547.   deletethis;
  548.   partrefresh
  549. end;
  550.  
  551. procedure insertline;
  552. begin
  553.   if m.numlines>=maxmessagesize then exit;
  554.   insertabove;
  555.   checkcx;
  556.   partrefresh
  557. end;
  558.  
  559. procedure help;
  560. var k:char;
  561. begin
  562.   clearscr;
  563.   printfile (configset.textfiledi+'Edithelp.Ans');
  564.   write (^B^M'Press a key to continue.');
  565.   k:=waitforchar;
  566.   fullrefresh
  567. end;
  568.  
  569. procedure breakline;
  570. begin
  571.   if (m.numlines>=maxmessagesize) or (cy=lines) or
  572.     (cx=1) or (cx>length(m.text[curline])) then exit;
  573.   insertabove;
  574.   m.text[curline]:=copy(m.text[curline+1],1,cx-1);
  575.   delete (m.text[curline+1],1,cx-1);
  576.   partrefresh
  577. end;
  578.  
  579. procedure joinlines;
  580. var n:integer;
  581. begin
  582.   if curline=m.numlines then exit;
  583.   if length(m.text[curline])+length(m.text[curline+1])>rightmargin then exit;
  584.   m.text[curline]:=m.text[curline]+m.text[curline+1];
  585.   n:=cx;
  586.   curline:=curline+1;
  587.   deletethis;
  588.   curline:=curline-1;
  589.   cx:=n;
  590.   partrefresh
  591. end;
  592.  
  593. procedure centerline;
  594. var spaces:lstr;
  595. begin
  596. { fillchar (spaces[1],80,32); }
  597. { delete(input,1,1);
  598.   while (length(input)>0) and (input[1]=' ') do delete (input,1,1);
  599.   if length(input)=0 then exit;
  600.   spaces[0]:=chr((cols-length(input)) div 2);
  601.   input:=spaces+input;
  602.   insertline; }
  603. end;
  604.  
  605. procedure userescape;
  606. var k:char;
  607. begin
  608.  
  609.     repeat
  610.     k:=waitforchar;
  611.         case k of
  612.             'A':upline;
  613.             'B':downline;
  614.             'C':fowrd;
  615.             'D':back
  616.         end
  617.     until (k<>'[') or hungupon
  618.  
  619. end;
  620.  
  621. procedure deleteeol;
  622. begin
  623.   cleareol;
  624.   m.text[curline][0]:=chr(cx-1)
  625. end;
  626.  
  627. procedure tab;
  628. var nx,n,cnt:integer;
  629. begin
  630.   nx:=((cx+8) and 248)+1;
  631.   n:=nx-cx;
  632.   if (n+length(m.text[curline])>=cols) or (nx>=cols) then exit;
  633.   for cnt:=1 to n do insert (' ',m.text[curline],cx);
  634.   updatetoeol;
  635.   cx:=cx+n;
  636.   updatecpos
  637. end;
  638.  
  639. procedure commands;
  640.  
  641.   function youaresure:boolean;
  642.   var q:string[1];
  643.   begin
  644.     youaresure:=false;
  645.     moveto (3,-2);
  646.     write (^A'Abort?'^P': '^U);
  647.     buflen:=1;
  648.     getstr;
  649.     cup (1);
  650.     moveto (3,-2);
  651.     write (^A'Command'^P':   ');
  652.     youaresure:=yes;
  653.     clearbreak;
  654.     nobreak:=true
  655.   end;
  656.  
  657.   procedure savemes;
  658.   begin
  659.     msgdone:=true;
  660.     ansireedit:=true
  661.   end;
  662.  
  663.   procedure abortmes;
  664.   begin
  665.     if youaresure then begin
  666.       m.numlines:=0;
  667.       msgdone:=true
  668.     end
  669.   end;
  670.  
  671.   procedure formattext;
  672.   var ol,il,c:integer;
  673.       oln,wd,iln:lstr;
  674.       k:char;
  675.  
  676.     procedure putword;
  677.     var cnt:integer;
  678.         b:boolean;
  679.     begin
  680.       b:=true;
  681.       for cnt:=1 to length(wd) do if wd[cnt]<>' ' then b:=false;
  682.       if b then exit;
  683.       while wd[length(wd)]=' ' do wd[0]:=pred(wd[0]);
  684.       if length(wd)=0 then exit;
  685.       if length(wd)+length(oln)>rightmargin then begin
  686.         m.text[ol]:=oln;
  687.         ol:=ol+1;
  688.         while (wd[1]=' ') and (length(wd)>0) do delete (wd,1,1);
  689.         oln:=wd
  690.       end else oln:=oln+wd;
  691.       if wd[length(wd)] in ['.','?','!']
  692.         then wd:='  '
  693.         else wd:=' '
  694.     end;
  695.  
  696.   begin
  697.     il:=curline;
  698.     ol:=il;
  699.     c:=1;
  700.     oln:='';
  701.     wd:='';
  702.     iln:=m.text[il];
  703.     repeat
  704.       if length(iln)=0 then begin
  705.         putword;
  706.         m.text[ol]:=oln;
  707.         partrefresh;
  708.         checkcx;
  709.         updatecpos;
  710.         exit
  711.       end;
  712.       if c>length(iln) then begin
  713.         il:=il+1;
  714.         if il>m.numlines
  715.           then iln:=''
  716.           else begin
  717.             iln:=m.text[il];
  718.             m.text[il]:=''
  719.           end;
  720.         c:=0;
  721.         k:=' '
  722.       end else k:=iln[c];
  723.       c:=c+1;
  724.       if k=' '
  725.         then putword
  726.         else wd:=wd+k
  727.     until 0=1
  728.   end;
  729.  
  730. var cmd:string[1];
  731.     k:char;
  732. begin
  733.   clearbreak;
  734.   nobreak:=true;
  735.   moveto (3,-2);
  736.   write (^A'Command'^P': '^U);
  737.   buflen:=1;
  738.   clearbreak;
  739.   nobreak:=true;
  740.   getstr;
  741.   cup (1);
  742.   moveto(3,-2);
  743.   write (^A'Command'^P':   ');
  744.   if length(input)=0 then begin
  745.     updatecpos;
  746.     exit
  747.   end;
  748.   k:=upcase(input[1]);
  749.   case k of
  750.     'S':savemes;
  751.     'A':abortmes;
  752.     'F':formattext;
  753.     '?':help
  754.   end;
  755.   updatecpos
  756. end;
  757.  
  758. procedure macrocmds;
  759. var cmd:string[1];
  760.     k:char;
  761.     x,y,z:integer;
  762. begin
  763.   clearbreak;
  764.   nobreak:=true;
  765.   moveto (3,-2);
  766.   write (^A'Macro 1-3'^P': ');
  767.   buflen:=1;
  768.     clearbreak;
  769.   nobreak:=true;
  770.   getstr;
  771.   cup (1);
  772.   Moveto (3,-2);
  773.   write (^A'Command'^P':   ');
  774.   if length(input)=0 then begin
  775.     updatecpos;
  776.     exit
  777.   end;
  778.   k:=upcase(input[1]);
  779.   case k of
  780.     '1':begin
  781.          updatecpos;
  782.          for x := 1 to length (urec.macro1) do
  783.           letterkey (urec.macro1[x]);
  784.         end;
  785.     '2':begin
  786.          updatecpos;
  787.          for y := 1 to length (urec.macro2) do
  788.           letterkey (urec.macro2[y]);
  789.         end;
  790.     '3':begin
  791.          updatecpos;
  792.          for z := 1 to length (urec.macro3) do
  793.           letterkey (urec.macro3[z]);
  794.         end;
  795.   end
  796.  { updatecpos }
  797. end;
  798.  
  799. procedure extendedcmds;
  800. begin
  801.  
  802. end;
  803.  
  804. procedure processkey;
  805. var k:char;
  806. begin
  807.   clearbreak;
  808.     nobreak:=true;
  809.     ingetstr:=true;
  810.     k:=waitforchar;
  811.     case k of
  812.         #27:userescape;
  813.         ' '..#199,#209..#255:letterkey (k);
  814.         ^S:back;
  815.         ^D:fowrd;
  816.         ^H:bkspace;
  817.         ^M:crlf;
  818.         ^V:toggleins;
  819.         ^E:upline;
  820.         ^X:downline;
  821.         ^U:help;
  822.         ^K:commands;
  823.         ^R:pageup;
  824.         ^C:pagedn;
  825.         ^G:del;
  826.         ^A:wordleft;
  827.         ^F:wordright;
  828.         ^T:worddel;
  829.         ^Q:beginline;
  830.         ^W:endline;
  831.         ^L:fullrefresh;
  832.         ^Y:deleteline;
  833.         ^N:insertline;
  834.         ^I:tab;
  835.         ^B:breakline;
  836.         ^P:deleteeol;
  837.         ^J:joinlines;
  838.         ^Z:macrocmds;
  839.         ^O:centerline;
  840.     end;
  841.     ingetstr:=false;
  842. end;
  843.  
  844. var cnt:integer;
  845.     mp:boolean;
  846. begin
  847.   clearbreak;
  848.   nobreak:=true;
  849.   ansireedit:=false;
  850.   for cnt:=m.numlines+1 to maxmessagesize do m.text[cnt]:='';
  851.   scrnsize:=24;
  852.   if local then scrnsize:=urec.displaylen;
  853.   unsplit;
  854.   wholescreen;
  855.   gotoxy (1,25);
  856.   clreol;
  857.   if eightycols in urec.config
  858.     then cols:=80
  859.     else cols:=40;
  860.   ansimode:=ansigraphics in urec.config;
  861.   mp:=moreprompts in urec.config;
  862.   if mp then urec.config:=urec.config-[moreprompts];
  863.   lines:=scrnsize-4; {lines:=22;}
  864.   topscrn:=scrnsize-lines+1;
  865.   insertmode:=false;
  866.   rightmargin:=cols-1;
  867.   msgdone:=false;
  868.   cx:=1;
  869.   curline:=1;
  870.   topline:=2-lines;
  871.   computecy;
  872.   updatecpos;
  873.   if m.numlines>0
  874.     then fullrefresh
  875.     else
  876.       begin
  877.         clearscr;
  878.         m.numlines:=1;
  879.         fullrefresh;
  880.       end;
  881.   repeat
  882.     processkey
  883.   until msgdone or hungupon;
  884.   moveto (1,lines);
  885.   cleareol;
  886.   writeln (^M^M^M^M);
  887.   if mp then urec.config:=urec.config+[moreprompts];
  888.   bottom;
  889.   bottomline
  890. end;
  891.  
  892. end.
  893.